/**
 * @description user service 数据处理
 * @author malin
 */

const { User } = require('../db/model')
const { formatUser } = require('./_format')
const { addFollower } = require('./user-relation')

/**
 * 获取用户信息（服务于用户登录、isExit、用户设置、查看用户信息）
 * @param {string} userName 用户名
 * @param {string} password 密码
 */
async function getUserInfo(userName, password) {
    // 查询条件
    const whereOpt = {
        userName
    }
    if(password) {
        Object.assign(whereOpt, { password })
    }
    // 查询（使用sequelize查询数据库）
    const result = await User.findOne({
        attributes: ['id', 'userName', 'nickName', 'picture', 'city'],
        where: whereOpt
    })
    if(result === null) {
        // 未找到
        return result
    }
    // 格式化处理
    const formatRes = formatUser(result.dataValues)
    return formatRes
}

/**
 * 创建用户
 * @param {string} userName 用户名
 * @param {string} password 密码
 * @param {string} nickName 昵称
 * @param {number} gender 性别 1 man 2 women 3 保密
 */
async function createUser({ userName, password, nickName, gender = 3 }) {
    const result = await User.create({
        userName,
        password,
        nickName: nickName || userName,
        gender
    })
    const data = result.dataValues
    // 自己关注自己（方便首页获取数据）
    addFollower(data.id, data.id)
    return data
}

/**
 * 删除用户
 * @param {string} userName 
 */
async function deleteUser(userName) {
    // result：返回删除的行数
    const result = await User.destroy({
        where: {
            userName
        }
    })
    return result > 0
}

/**
 * 更新用户信息
 * @param {object} param0 要修改的内容 { newPassword, newNickName, newPicture, newCity }
 * @param {object} param1 查询条件 { userName, password }
 */
async function updateUser(
    { newPassword, newNickName, newPicture, newCity },
    { userName, password }
) {
    // 拼接修改内容
    let updateData = {}
    newPassword && (updateData.password = newPassword)
    newNickName && (updateData.nickName = newNickName)
    newPicture && (updateData.picture = newPicture)
    newCity && (updateData.city = newCity)
    // 拼接查询条件
    let whereOpt = {
        userName
    }
    password && (whereOpt.password = password)
    // 执行修改
    const result = await User.update(updateData, {
        where: whereOpt
    })
    return result[0] > 0    // 看看修改的行数是否大于0
}

module.exports = {
    getUserInfo,
    createUser,
    deleteUser,
    updateUser
}
